﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using ABC.Business.Models;
using ABC.Controllers.ViewModels.My;
using ABC.Core.Configuration;
using ABC.Core.Providers;
using ABC.Domain.Entities;
using System.Linq;
using ABC.Domain.Json;
using ABC.Domain.Serialization;
using Ionic.Zip;
using ABC.Core.Extentions;
using Castle.Core.Logging;


namespace ABC.Controllers.Areas.My
{
    [Authorize]
    public class CabinetController : BaseController
    {
        private readonly CabinetModel cabinetModel;
        private readonly ClientsModel clientsModel;
        private readonly RbsCalcModel rbsCalcModel;
        private readonly ExcelModel excelModel;
        private readonly YandexDiskModel yandexDiskModel;
        private readonly RosModel rosModel;
        private readonly FinanceModel financeModel;
        private readonly ILogger logger;
        private const string RootFolder = "DocumentsObject";
        private static IApplicationSettingsProvider ApplicationSettingsProvider;

        public CabinetController(CabinetModel cabinetModel, ClientsModel clientsModel, RbsCalcModel rbsCalcModel, ExcelModel excelModel, YandexDiskModel yandexDiskModel, RosModel rosModel, FinanceModel financeModel, ILogger logger)
        {
            this.cabinetModel = cabinetModel;
            this.rbsCalcModel = rbsCalcModel;
            this.clientsModel = clientsModel;
            this.excelModel = excelModel;
            this.yandexDiskModel = yandexDiskModel;
            this.rosModel = rosModel;
            this.financeModel = financeModel;
            this.logger = logger;
            ApplicationSettingsProvider = IoC.Resolve<IApplicationSettingsProvider>();
        }
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Payment()
        {
            return View();
        }

        public ActionResult GetObjectId(string carManufacture, string carModel, string carRelease)
        {
            if (!string.IsNullOrEmpty(carManufacture) && !string.IsNullOrEmpty(carModel) && !string.IsNullOrEmpty(carRelease))
            {
                var filters = new Dictionary<string, object>()
                                  {
                                      {
                                          "НазваниеОбъекта", (carManufacture + " " + carModel + ", " + carRelease)
                                      },
                                      { "Удален", false }
                                  };
                var objects = rosModel.GetEntities(
                    "[Типы=ОбъектСтрахования;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Desc);Места=(" + CurrentUser.Id + ",1)]", filters);

                if (objects.Count > 0)
                {
                    var id = objects.FirstOrDefault()["id_node"].ToString();
                    return RedirectToAction("AddObject", "Cabinet", new { id });
                }

            }
            return RedirectToAction("AddObject", "Cabinet");
        }

        [HttpGet]
        public ActionResult AddObject(string insurerid, string id)
        {
            var model = new ObjectInsuranceViewModel();
            var clientsId = clientsModel.GetClientsIdAtWork(CurrentUser.Id);
            model.Clients = clientsModel.GetClients(clientsId.ToArray(), CurrentUser.Id);
            model.ExistingFiles = "[]";
            var serializer = new JavaScriptSerializer();
            model.Icons = serializer.Serialize(cabinetModel.GetIconsUrl());

            if (!string.IsNullOrEmpty(id))
            {
                var obj = cabinetModel.GetObject(id);
                model.Id = id;
                model.InsurantId = obj.InsurantId;
                model.Engine = obj.Engine;
                model.Category = obj.Category;
                model.CarManufacture = obj.CarManufacture;
                model.CarModel = obj.CarModel;
                model.CategoryTs = obj.CategoryTs;
                model.NameInsurant = obj.NameInsurant;
                model.Release = obj.Release;
                model.Power = obj.Power;
                model.Operation = obj.Operation.ToString("dd.MM.yyyy") == DateTime.MinValue.ToString("dd.MM.yyyy") ? "" : obj.Operation.ToString("dd.MM.yyyy");
                model.Pts = obj.Pts.ToString("dd.MM.yyyy") == DateTime.MinValue.ToString("dd.MM.yyyy") ? "" : obj.Pts.ToString("dd.MM.yyyy");
                model.Controlwheel = obj.Controlwheel;
                model.Landing = obj.Landing;
                model.Maxmass = obj.Maxmass;
                model.Mass = obj.Mass;
                model.Calculations = rbsCalcModel.GetCalculationsForObject(CurrentUser.Id, model.Id,
                                                                           model.CarManufacture + " " + model.CarModel +
                                                                           ", " + model.Release);
                var files = yandexDiskModel.GetDirectoriesInfo(string.Format("{0}/{1}", RootFolder, id));
                if (files != null)
                {
                    model.ExistingFiles = serializer.Serialize(files.Where(x => x.ContentLenght > 0).Select(
                         x => new ViewDataUploadFilesResult
                             {
                                 Name = x.DisplayName,
                                 DeleteUrl = Url.Action("Delete", new { name = x.DisplayName, id }),
                                 DeleteType = "GET",
                                 Size = x.ContentLenght,
                                 Url = Url.Action("Download", new { name = x.DisplayName, id }),
                                 ThumbnailUrl = IconsModel.ImageExt.Contains(x.DisplayName.Substring(x.DisplayName.LastIndexOf('.'))) ? Url.Thumbnail(RootFolder + "/" + id + "/" + x.DisplayName, 120, 100) : cabinetModel.GetUrl(IconsModel.MimeTypes.Where(z => z.Key == x.DisplayName.Substring(x.DisplayName.LastIndexOf('.'))).FirstOrDefault().Value),
                                 DateUpload = DateTime.Parse(x.CreationDate, CultureInfo.InvariantCulture).ToString("dd.MM.yyyy HH:mm"),
                                 ReviewUrl = IconsModel.ImageExt.Contains(x.DisplayName.Substring(x.DisplayName.LastIndexOf('.'))) ? Url.Thumbnail(RootFolder + "/" + id + "/" + x.DisplayName, 1024, 768) : cabinetModel.GetUrl(IconsModel.MimeTypes.Where(z => z.Key == x.DisplayName.Substring(x.DisplayName.LastIndexOf('.'))).FirstOrDefault().Value),
                             }).ToList());
                }
                return View("AddObject", model);
            }
            if (!string.IsNullOrEmpty(insurerid))
            {
                var client = clientsModel.GetClient(insurerid, CurrentUser.Id);
                model.NameInsurant = string.Format("{0} {1}", client.FirstName, client.LastName);
                model.InsurantId = insurerid;
            }
            return View("AddObject", model);
        }

        [HttpPost]
        public ActionResult AddObject(ObjectInsuranceViewModel model)
        {
            var values = new Dictionary<string, object>();
            values.Add("НазваниеОбъекта", model.CarManufacture + " " + model.CarModel + ", " + model.Release);
            values.Add("ТипОбъектСтрахования", model.Category);
            values.Add("Страхователь", model.NameInsurant);
            values.Add("СсылкаНаСтрахователя", Convert.ToDecimal(model.InsurantId));
            values.Add("КатегорияТС", model.CategoryTs);
            values.Add("Марка", model.CarManufacture);
            values.Add("Модель", model.CarModel);
            values.Add("ГодВыпуска", model.Release);
            values.Add("ДвигателяОбъем", model.Engine);
            values.Add("МощностьДвигателя", model.Power);
            DateTime dateOperation;
            if (DateTime.TryParse(model.Operation, CultureInfo.CreateSpecificCulture("ru-RU"), DateTimeStyles.None, out dateOperation))
            {
                values.Add("НачалоЭксплуатации", dateOperation);
            }
            else
            {
                values.Add("НачалоЭксплуатации", DateTime.MinValue);
            }
            DateTime datePts;
            if (DateTime.TryParse(model.Pts, CultureInfo.CreateSpecificCulture("ru-RU"), DateTimeStyles.None, out datePts))
            {
                values.Add("ДатаВыдачиПтс", datePts);
            }
            else
            {
                values.Add("ДатаВыдачиПтс", DateTime.MinValue);
            }
            values.Add("Руль", model.Controlwheel);
            values.Add("КоличествоМест", model.Landing);
            values.Add("МаксимальнаяМасса", model.Maxmass);
            values.Add("Грузоподъемность", model.Mass);
            if (string.IsNullOrEmpty(model.Id))
            {
                values.Add("Удален", false);
                model.Id = cabinetModel.AddObject(CurrentUser.Id, values).ToString();
            }
            else
            {
                cabinetModel.UpdateObject(model.Id, values);
            }

            if (!string.IsNullOrEmpty(Request.Form["filesName"]))
            {
                var filesName = Request.Form["filesName"].Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                var directories = yandexDiskModel.GetDirectoriesInfo(RootFolder);
                if (!directories.Any(x => x.DisplayName == model.Id))
                {
                    if (yandexDiskModel.CreateDirectory(string.Format("{0}/{1}", RootFolder, model.Id)))
                    {
                        foreach (var name in filesName)
                        {
                            yandexDiskModel.MoveFile(RootFolder, RootFolder, model.Id, name);
                        }
                    }
                }
            }
            return RedirectToAction("AddObject", "Cabinet", new { id = model.Id });
        }

        public ActionResult Comparison(string[] companyNames, string calcId)
        {
            if (companyNames == null || string.IsNullOrEmpty(calcId))
            {
                return RedirectToAction("Kasko", "Information");
            }
            var model = new ComparisonViewModel();
            var calc = rbsCalcModel.GetCalculationKasko(calcId);
            var servicePrograms = cabinetModel.GetServiceProgram();
            var companiesChecked = new List<KaskoResult>();
            foreach (var t in companyNames)
            {
                foreach (var result in calc.KaskoResults.Where(result => t == result.CompanyName))
                {
                    companiesChecked.Add(result);
                    break;
                }
            }

            foreach (var company in companiesChecked)
            {
                var comparison = new Comparison(servicePrograms.Length)
                                     {
                                         CompanyName = company.CompanyName,
                                         KaskoValue = company.KaskoValue
                                     };
                for (var i = 0; i < servicePrograms.Length; i++)
                {
                    if (company.ServiceProgram.ToLower().IndexOf(servicePrograms[i].ToLower()) >= 0)
                    {
                        comparison.Is[i] = true;
                    }
                }
                model.CompaniesForComparison.Add(comparison);
            }
            Domain.Entities.Comparison.ServicePrograms = servicePrograms;

            return View(model);
        }
        [HttpPost]
        public ActionResult ExportExcel(string resultId)
        {
            return new ExcelResult("Результат_расчета_КАСКО.xls", excelModel.GetXlsKaskoResults(resultId));
        }

        [HttpPost]
        public void GetFiles(string names, string objectId)
        {
            var serializer = new JavaScriptSerializer();
            var fileNames = serializer.Deserialize<string[]>(names);
            var zipName = string.IsNullOrEmpty(objectId) ? "Files.zip" : string.Format("{0}.zip", rosModel.GetEntityValue<string>(objectId, "НазваниеОбъекта")).Replace(" ", "-").Replace(",", "");
            HttpContext.Response.Clear();
            HttpContext.Response.ContentType = "application/zip";
            HttpContext.Response.AddHeader("Content-Disposition", "filename=" + zipName);
            HttpContext.Response.BufferOutput = true;
            var filesPath = new List<string>(); // для последующего удаления
            using (var zip = new ZipFile())
            {
                zip.AlternateEncoding = Encoding.GetEncoding("cp866");
                foreach (var f in fileNames)
                {
                    var stream = yandexDiskModel.DownloadFile(string.Format("{0}/{1}", RootFolder + (string.IsNullOrEmpty(objectId) ? "" : "/" + objectId), f));
                    var filePath = Path.Combine(Server.MapPath("~/Uploads"), f);
                    using (var ms = new MemoryStream())
                    {
                        stream.CopyTo(ms);
                        System.IO.File.WriteAllBytes(filePath, ms.ToArray());
                        filesPath.Add(filePath);
                    }
                    zip.AddFile(filePath, "");
                }
                zip.Save(HttpContext.Response.OutputStream);

            }
            foreach (var file in filesPath)
            {
                System.IO.File.Delete(file);
            }
            HttpContext.Response.Flush();
            HttpContext.Response.End();
        }

        [HttpGet]
        public void Delete(string name, string id)
        {
            if (!string.IsNullOrEmpty(name))
            {
                yandexDiskModel.DeleteDirectoryOrFile(string.Format("{0}/{1}", RootFolder + (string.IsNullOrEmpty(id) ? "" : "/" + id), name));
            }
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        [HttpGet]
        public void Download(string name, string id)
        {
            var stream = yandexDiskModel.DownloadFile(string.Format("{0}/{1}",
                                                       RootFolder + (string.IsNullOrEmpty(id) ? "" : "/" + id), name));
            var context = HttpContext;
            using (var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + name + "\"");
                context.Response.ContentType = "application/octet-stream";
                context.Response.ClearContent();
                context.Response.BinaryWrite(ms.ToArray());
            }
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        [HttpPost]
        public ActionResult UploadFiles(string id)
        {
            var r = new List<ViewDataUploadFilesResult>();
            var directories = yandexDiskModel.GetDirectoriesInfo("");
            if (directories.All(x => x.DisplayName != RootFolder))
            {
                yandexDiskModel.CreateDirectory(RootFolder);
            }
            if (directories.All(x => x.DisplayName != id) && !string.IsNullOrEmpty(id))
            {
                yandexDiskModel.CreateDirectory(RootFolder + "/" + id);
            }
            for (var i = 0; i < Request.Files.Count; )
            {
                var file = Request.Files[i];
                var ext = file.FileName.Substring(file.FileName.LastIndexOf('.'));
                var guid = Guid.NewGuid();
                var fileResult = new ViewDataUploadFilesResult();
                fileResult.Name = string.Format("{0}{1}", guid, ext.ToLower());
                fileResult.Size = file.ContentLength;
                fileResult.Type = file.ContentType;
                fileResult.Url = Url.Action("Download", new { name = string.Format("{0}{1}", guid, ext.ToLower()), id });
                fileResult.DeleteUrl = Url.Action("Delete",
                                                  new { name = string.Format("{0}{1}", guid, ext.ToLower()), id });
                fileResult.ThumbnailUrl = fileResult.Type.IndexOf("image") >= 0 ? Url.Thumbnail(string.Format("{0}/{1}", RootFolder + (string.IsNullOrEmpty(id) ? "" : "/" + id), fileResult.Name), 120, 100) : cabinetModel.GetUrl(fileResult.Type);
                fileResult.DeleteType = "GET";
                fileResult.DateUpload = DateTime.Now.ToString("dd.MM.yyyy HH:mm");
                fileResult.ReviewUrl = fileResult.Type.IndexOf("image") >= 0 ? Url.Thumbnail(string.Format("{0}/{1}", RootFolder + (string.IsNullOrEmpty(id) ? "" : "/" + id), fileResult.Name), 1024, 768) : cabinetModel.GetUrl(fileResult.Type);
                r.Add(fileResult);

                var result = Json(r);
                result.ContentType = "text/plain";
                yandexDiskModel.UploadFile(RootFolder + (string.IsNullOrEmpty(id) ? "" : "/" + id), file, string.Format("{0}{1}", guid, ext.ToLower()), fileResult.Type);
                return result;
            }
            return Json(r);
        }

        public ActionResult Confirm(string calcId, string confirmTarifId)
        {
            var model = new ConfirmCalculationViewModel();
            model.Id = calcId;
            var calc = rbsCalcModel.GetCalculationKasko(calcId);
            model.UniqueNumber = calc.UniqueNumber;
            model.DateCalculation = rosModel.GetEntityValue<DateTime>(calcId, "ДатаСозданияОбъекта");
            if (!string.IsNullOrEmpty(confirmTarifId))
            {
                model.Calculations.Add(rbsCalcModel.GetCalculationForConfirm(confirmTarifId));
            }
            /*foreach (var result in calc.KaskoResults)
            {
                var calculationForConfirm = new CalculationForConfirm();
                calculationForConfirm.Name = result.CompanyName;
                double sum;
                calculationForConfirm.InsuredSum = Double.TryParse(calc.Cost, out sum) ? sum.ToString("N2") : "0";
                calculationForConfirm.Rate = result.KaskoRate.ToString("N2");
                calculationForConfirm.CalculatedPremium = ((result.KaskoRate * Double.Parse(calculationForConfirm.InsuredSum)) / 100).ToString("N2");
                model.Calculations.Add(calculationForConfirm);
            }*/
            return View(model);
        }

        [HttpPost]
        public ActionResult Confirm(string[] companyNames, string calcId)
        {
            var model = new ConfirmCalculationViewModel();
            model.Id = calcId;
            rosModel.UpdateEntityValue(model.Id, "СохраненРасчет", true);
            var calc = rbsCalcModel.GetCalculationKasko(calcId);
            model.UniqueNumber = calc.UniqueNumber;
            model.DateCalculation = rosModel.GetEntityValue<DateTime>(calcId, "ДатаСозданияОбъекта");
            foreach (var result in calc.KaskoResults)
            {
                if (companyNames.Contains(result.CompanyName))
                {
                    var calculationForConfirm = new CalculationForConfirm();
                    calculationForConfirm.Name = result.CompanyName;
                    double sum;
                    calculationForConfirm.InsuredSum = Double.TryParse(calc.Cost, out sum) ? sum.ToString("N2") : "0";
                    calculationForConfirm.Rate = result.KaskoRate.ToString("N2");
                    calculationForConfirm.CalculatedPremium = ((result.KaskoRate * Double.Parse(calculationForConfirm.InsuredSum)) / 100).ToString("N2");
                    model.Calculations.Add(calculationForConfirm);
                }
            }
            return View(model);
        }
        [HttpPost]
        public string DeleteFileCalculation(string fileId)
        {
            if (!string.IsNullOrEmpty(fileId))
            {
                var confirmCalcId = rosModel.GetEntityValue<decimal>(fileId, "@РодительскийРаздел").ToString();
                rosModel.DeleteEntity(fileId, true);
                var values = new Dictionary<string, object>();
                values.Add("СсылкаНаФайлРасчета", 0M);
                cabinetModel.UpdateConfirmTarif(confirmCalcId, values);
            }
            return "ok";
        }

        public string DownloadFile(string id)
        {
            var file = rosModel.GetFile(id);
            HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + rosModel.GetEntityValue<string>(id, "НазваниеОбъекта") + "\"");
            HttpContext.Response.ContentType = "application/octet-stream";
            HttpContext.Response.ClearContent();
            HttpContext.Response.BinaryWrite(file);
            return "ok";
        }

        [HttpPost]
        public ActionResult SaveConfirm(string id)
        {
            var serializer = new JavaScriptSerializer();
            var itemsCalculation = serializer.Deserialize<List<CalculationForConfirm>>(Request.Form["calculations"]);

            for (var i = 0; i < itemsCalculation.Count; i++)
            {
                var item = itemsCalculation[i];
                var values = new Dictionary<string, object>();
                switch (item.ConfirmType)
                {
                    case "Самостоятельно":
                        values.Add("НазваниеОбъекта", item.Name);
                        values.Add("ТипПодтверждения", item.ConfirmType);
                        values.Add("СтраховаяСумма", string.IsNullOrEmpty(item.InsuredSum) ? "0" : item.InsuredSum);
                        values.Add("Тариф", item.Rate);
                        values.Add("РасчетнаяПремия", string.IsNullOrEmpty(item.CalculatedPremium) ? "0" : item.CalculatedPremium);
                        values.Add("ОфициальнаяСкидка", string.IsNullOrEmpty(item.OfficialDiscount) ? "0" : item.OfficialDiscount);
                        values.Add("НеофициальнаяСкидка", string.IsNullOrEmpty(item.UnofficialDiscount) ? "0" : item.UnofficialDiscount);
                        values.Add("ПремияПоПолису", string.IsNullOrEmpty(item.PremiumPolicy) ? "0" : item.PremiumPolicy);
                        values.Add("ВеличинаПервогоВзноса", string.IsNullOrEmpty(item.Fee) ? "0" : item.Fee);
                        values.Add("ВеличинаПервогоВзносаРуб", string.IsNullOrEmpty(item.FeeRub) ? "0" : item.FeeRub);
                        values.Add("СтоимостьПолиса", string.IsNullOrEmpty(item.CostPolicy) ? "0" : item.CostPolicy);
                        values.Add("ФлагРасчетПодтвержден", true);
                        values.Add("ДатаПодтвержденияКотировки", DateTime.Now);
                        values.Add("РасчетПодтвержден", CurrentUser.FullName);
                        break;
                    case "Не подтверждать":
                        continue;
                    case "Андеррайтер брокера":
                        values.Add("НазваниеОбъекта", item.Name);
                        values.Add("ТипПодтверждения", item.ConfirmType);
                        break;
                }

                if (string.IsNullOrEmpty(item.Id))
                    item.Id = rosModel.AddEntity(id, "ПодтверждениеРасчета", values).ToString("F0");
                else
                    cabinetModel.UpdateConfirmTarif(item.Id, values);

                var file = Request.Files["fileUpload" + i];
                if (file != null && (item.ConfirmType == "Самостоятельно" && file.ContentLength > 0))
                {
                    values = new Dictionary<string, object>();
                    values.Add("СсылкаНаФайлРасчета", rosModel.SaveFile(item.Id, file));
                    values.Add("ДатаЗагрузкиФайлаРасчета", DateTime.Now);
                    cabinetModel.UpdateConfirmTarif(item.Id, values);
                }

                if (item.ConfirmType == "Андеррайтер брокера")
                {
                    var key = rosModel.GetEntityValue<string>(CurrentUser.Id, "ИдентификаторОбъекта");
                    decimal id_user = 0;
                    // пользователь не связан с РБС
                    if (!key.Contains("RBS"))
                        throw new Exception("Ошибка! Запрос не может быть отправлен в андеррайтинг! Пользователь не найден в системе РБК!");

                    // отправим запрос в колцентр на подтверждение
                    System.Threading.Tasks.Task.Factory.StartNew(
                    () =>
                    {
                        try
                        {
                            var keyКотировочногоЛиста = rosModel.GetEntityValue<string>(CurrentUser.Id, "ИдентификаторОбъекта");
                            var IdЛист = 0M;

                            if (keyКотировочногоЛиста.Contains("RBC"))
                                decimal.TryParse(keyКотировочногоЛиста.Split(':')[1], out IdЛист);
                            // Создаем котировку если ее нет 
                            else
                            {
                                id_user = rosModel.GetEntityValueCallCenter<decimal>(key, "id_node");
                                var kindInsurance = "КАСКО";
                                var auto = rbsCalcModel.GetCalculationKasko(id);

                                #region Создаем в колл-центре заявку на страхование и клиента через внешнюю интеграцию (так проще)
                                var html = new Dictionary<string, string>();
                                html.Add("Вид страхования", kindInsurance);
                                html.Add("Объект страхования", string.Format("{0} {1} {2}", auto.CarModel, auto.CarModel, auto.Release));
                                html.Add("Тип подтверждения", "Андеррайтер брокера");
                                html.Add("Страховая компания", item.Name);

                                var sb = new StringBuilder();
                                sb.Append("<table>");
                                foreach (var d in html)
                                    if (!d.Key.Contains("Телефон"))
                                        sb.AppendFormat("<tr><th>{0}</th><td>{1}</td></tr>", d.Key, d.Value);

                                sb.Append("</table>");

                                var html_txt = sb.ToString();

                                var paramList = new Dictionary<string, object>();
                                paramList["IsAsinc"] = false.ToString();
                                paramList["FIO"] = CurrentUser.FullName;
                                paramList["Phones"] = CurrentUser.TelephoneNumber;
                                paramList["Email"] = CurrentUser.Email;
                                paramList["Source"] = "azb24";
                                paramList["KindOfInsurance"] = kindInsurance;
                                paramList["Marka"] = auto.CarManufacture;
                                paramList["Model"] = auto.CarModel;
                                paramList["YearObject"] = auto.Release;
                                paramList["HtmlForm"] = html_txt;

                                var serverUrl = "http://agent.azb.ru/k/web/";

                                var req = System.Net.WebRequest.Create(serverUrl);
                                req.Method = "POST";
                                req.ContentType = "application/x-www-form-urlencoded";

                                var query = string.Join("&", paramList.Select(p => string.Format("{0}={1}", p.Key, p.Value)).ToArray());

                                byte[] requestBodyBytes = Encoding.UTF8.GetBytes(query);

                                req.ContentLength = requestBodyBytes.Length;

                                var newStream = req.GetRequestStream();
                                newStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
                                newStream.Close();

                                var response = req.GetResponse();
                                var reader = new StreamReader(response.GetResponseStream());
                                var responseStr = reader.ReadToEnd().Trim();
                                decimal webId;
                                if (decimal.TryParse(responseStr, out webId))
                                {
                                    var card = new Dictionary<string, string>
                                                   {
                                                       {"Марка", auto.CarManufacture},
                                                       {"Модель", auto.CarModel},
                                                       {"Год выпуска", auto.Release},
                                                       {"Регион", auto.Region},
                                                       {"Страхователь", auto.Insurant},
                                                       {"Новое", auto.IsNewCar},
                                                       {"Дата расчета", auto.DateOfCalculation},
                                                       {"Гарантия", auto.Guaranty},
                                                       {"Мощность", auto.Power},
                                                       {"Кредит", auto.Credit},
                                                       {"Стоимость ТС", auto.Cost},
                                                       {"Валюта расчета", auto.Currency},
                                                       {"Франшиза в рублях", auto.FranshizaInRub},
                                                       {"Франшиза в процентах", auto.FranshizaInProc},
                                                       {"Форма возмещения", auto.Compensation},
                                                       {"Масса", auto.Mass},
                                                       {"Оплата", auto.Payment},
                                                       {"Срок страхования", auto.InsurancePeriod},
                                                       {"Переход", auto.Transition},
                                                       {"Условия хранения", auto.StorageCondition},
                                                       {"Предельный пробег", auto.Maxpath},
                                                       {"Количество ТС", auto.QuantityTs},
                                                       {"Руль", auto.ControlWheel},
                                                       {"ЭПС", auto.Signaling},
                                                       {"ЭПС с автозапуском", auto.Autostart},
                                                       {"Метка", auto.Siglabel},
                                                       {"МПУ", auto.Mpu},
                                                       {"Иммобилайзер", auto.Immo},
                                                       {"Противоугонный комплекс", auto.Siganticreep},
                                                       {"ОПС", auto.Sigantidamping},
                                                       {"Допущенные водители", auto.TypeDrivers}
                                                   };
                                    switch (auto.TypeDrivers)
                                    {
                                        case "Ограниченное количество":
                                            for (var j = 0; j < auto.Drivers.Count + 1; j++)
                                            {
                                                card.Add("Пол водителя " + (j == 0 ? "" : (j + 1).ToString()), auto.Drivers[j].Sex);
                                                card.Add("Возраст водителя " + (j == 0 ? "" : (j + 1).ToString()), auto.Drivers[j].Age);
                                                card.Add("Стаж водителя " + (j == 0 ? "" : (j + 1).ToString()), auto.Drivers[j].Experience);
                                                card.Add("Наличие брака водителя " + (j == 0 ? "" : (j + 1).ToString()), auto.Drivers[j].Married);
                                                card.Add("Количество детей водителя " + (j == 0 ? "" : (j + 1).ToString()), auto.Drivers[j].Children);
                                            }
                                            break;
                                        case "Неограниченное количество":
                                            card.Add("Минимальный возраст", auto.MinAge);
                                            card.Add("Минимальный стаж", auto.MinPeriod);
                                            break;
                                    }

                                    rosModel.UpdateEntityValueCallCenter(webId.ToString(), "XmlФорма", new Ros.RBS.Dal().СериализоватьИСохранитьЗначение(card));
                                    rosModel.UpdateEntityValueCallCenter(webId.ToString(), "ВиртуальныйКаталог", "/Заявление/Агент/Кабинет/Подтверждение в андеррайтинг/");
                                }
                                #endregion

                                #region Создаем котировочный лист
                                var Items = new List<Ros.RBS.Dal.КотировочныйЛистItem>();

                                var itemList = new Ros.RBS.Dal.КотировочныйЛистItem(item.Name);

                                var val = 0M;
                                decimal.TryParse(item.InsuredSum.Replace(".", ","), out val);
                                itemList.ОценочнаяСтоимсоть = val;

                                decimal.TryParse(item.Rate.Replace(".", ","), out val);
                                itemList.Тариф = val;

                                decimal.TryParse(item.CalculatedPremium.Replace(".", ","), out val);
                                itemList.СтраховаяПремия = val;
                                itemList.СтраховаяПремияИтого = val;
                                itemList.СтраховаяПремияПоПолису = val;
                                itemList.ПервыйВзнос = val;
                                itemList.ПервыйВзносВзятьСКлиента = val;
                                itemList.Подтверждение = true;

                                Items.Add(itemList);

                                // Создадим консультирование 
                                var vals = new Dictionary<string, object>();
                                vals.Add("ДатаПерезвона", DateTime.Now);
                                vals.Add("ДатаПерезвонаПредпоследняя", DateTime.Now);
                                vals.Add("СсылкаНаПользователя", id_user);
                                vals.Add("СтатусКонсультации", "Обзвон");
                                vals.Add("СсылкаНаКлиента", rosModel.GetEntityValueCallCenter<decimal>(webId.ToString(), "СсылкаНаКлиента"));
                                vals.Add("ВиртуальныйКаталог", "/Консалтинг/");
                                vals.Add("ДатаСтрахования", DateTime.Now);

                                var IdКонсультации = rosModel.AddEntityToCallCenter("Консалтинг", "Консультирование", vals);

                                vals = new Dictionary<string, object>();
                                vals.Add("СсылкаНаЗаявку", webId);
                                vals.Add("Результат", "В работе");

                                var IdРезультата = rosModel.AddEntityToCallCenter(IdКонсультации.ToString(), "РезультатКонсультированияПоЗаявке", vals);

                                vals = new Dictionary<string, object>();
                                vals.Add("СсылкаНаЗаявку", webId);
                                vals.Add("СсылкаНаРезультаПоКонсультированию", IdРезультата);
                                vals.Add("ВиртуальныйКаталог", "/КотировочныйЛист/");
                                vals.Add("СсылкаНаПользователя", id_user);
                                vals.Add("ИдентификаторОбъекта", "RLC:" + item.Id);
                                vals.Add("XmlФорма", rosModel.GetEntityValueCallCenter<string>(webId.ToString(), "XmlФорма"));

                                IdЛист = rosModel.AddEntityToCallCenter(IdРезультата.ToString(), "КотировочныйЛист", vals);
                                rosModel.UpdateEntityValueCallCenter(IdРезультата.ToString(), "СсылкаНаТекущийКотировочныйЛист", IdЛист);

                                rosModel.UpdateEntityValueCallCenter(IdЛист.ToString(), "List<КотировочныйЛистItem>", new Ros.RBS.Dal().СериализоватьИСохранитьЗначение(Items));

                                rosModel.UpdateEntityValue(item.Id, "ИдентификаторОбъекта", "RBC:" + IdЛист.ToString("f0"));
                                #endregion
                            }

                            // создаем котировочный лист 
                            // высылаем его на подтверждение
                            new Business.RosSender.ОтправительClient().ПеремещениеЗаявкиПользователю(id_user, "SendRBSCalcAcceptAnred", id_user, new decimal[] { IdЛист });
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex.Message, ex);
                        }
                    });
                }
            }
            return RedirectToAction("ConfirmedTarif", new { page = 1 });
        }

        public ActionResult Calculations(string pagesize, int? page)
        {
            var model = new CalculationsViewModel();
            if (!page.HasValue)
            {
                page = 1;
            }
            if (string.IsNullOrEmpty(pagesize) || pagesize == "0")
            {
                pagesize = model.ListForPageSize.First().Value;
            }
            var calculations = rbsCalcModel.SortCalculations(CurrentUser.Id);
            model.PageCount = (int)Math.Ceiling((double)calculations.Count / Int32.Parse(pagesize));
            model.Calculations = calculations.Skip((page.Value - 1) * Int32.Parse(pagesize)).Take(Int32.Parse(pagesize)).ToList();
            model.PageNumber = page.Value;
            if (model.Calculations.Count == 0)
            {
                if (page.Value > 1)
                {
                    page = model.PageCount;
                    return RedirectToAction("Calculations", new { page, pagesize });
                }
            }
            return View(model);
        }

        [HttpGet]
        public ActionResult DeleteCalculation(string deleteId, string id)
        {
            if (!string.IsNullOrEmpty(deleteId))
            {
                rosModel.UpdateEntityValue(deleteId, "СохраненРасчет", false);
            }
            return RedirectToAction("AddObject", new { id });
        }

        [HttpPost]
        public ActionResult DeleteCalculation(string id, string pagesize, int? page)
        {
            if (!string.IsNullOrEmpty(id))
            {
                rosModel.UpdateEntityValue(id, "СохраненРасчет", false);
            }
            return RedirectToAction("Calculations", new { page, pagesize });
        }

        [HttpPost]
        public ActionResult DeleteCalculations(string[] calculation, string pagesize, int? page)
        {
            foreach (var id in calculation)
            {
                rosModel.UpdateEntityValue(id, "СохраненРасчет", false);
            }
            return RedirectToAction("Calculations", new { page, pagesize });
        }

        [HttpPost]
        public ActionResult DeleteCalculationsForObject(string[] calculation, string id)
        {
            foreach (var calcId in calculation)
            {
                rosModel.UpdateEntityValue(calcId, "СохраненРасчет", false);
            }
            return RedirectToAction("AddObject", new { id });
        }

        public ActionResult CalcSk()
        {
            return View();
        }

        public ActionResult Tickets(string pagesize, int? page, string status)
        {
            var model = new MyTicketsViewModel();
            if (!page.HasValue)
            {
                page = 1;
            }
            if (string.IsNullOrEmpty(pagesize) || pagesize == "0")
            {
                pagesize = model.ListForPageSize.First().Value;
            }
            int pageCount;
            model.Tickets = cabinetModel.GetEditTickets(CurrentUser.Id, !string.IsNullOrEmpty(status) ? status : "", out pageCount, Int32.Parse(pagesize), page.Value - 1);
            model.PageCount = pageCount;
            model.PageNumber = page.Value;
            if (model.Tickets.Count == 0 && model.PageCount > 0)
            {
                if (page > 1)
                {
                    page = model.PageCount;
                    return RedirectToAction("Tickets", new { page, pagesize, status });
                }
            }
            return View(model);
        }

        public ActionResult FormDelivery()
        {
            var model = new MyDeliveryViewModel();
            model.ConfirmedCalculationsKasko = rbsCalcModel.GetAllConfirmedCalculationsKasko(CurrentUser.Id);
            model.ConfirmedCalculationsOsago = rbsCalcModel.GetAllConfirmedCalculationsOsago(CurrentUser.Id);
            model.Clients = clientsModel.GetClients(clientsModel.GetClientsIdAtWork(CurrentUser.Id), CurrentUser.Id);
            model.ListForCompanies =
                rbsCalcModel.GetCompaniesWithOsago().Select(x => new SelectListItem { Text = x.Name, Value = x.Id }).
                    ToList();
            return View(model);
        }
        [HttpPost]
        public ActionResult FormDelivery(MyDeliveryViewModel model)
        {
            var serializer = new JavaScriptSerializer();
            var products = serializer.Deserialize<List<ProductDelivery>>(Request.Form["products"]);
            var values = new Dictionary<string, object>();
            values.Add("НазваниеОбъекта", string.Format("{0},{1}", model.Service, model.Name));
            values.Add("ВидУслуги", model.Service);
            decimal insurantId;
            values.Add("СсылкаНаСтрахователя", Decimal.TryParse(model.InsurantId, out insurantId) ? insurantId : 0);
            values.Add("Страхователь", model.Name);
            values.Add("ТелефонныйНомер", model.Phone);
            values.Add("Email", model.Email);
            values.Add("Адрес", model.Address);
            DateTime date;
            values.Add("ДатаДоставки", DateTime.TryParse(model.Date, out date) ? date : DateTime.MinValue);
            TimeSpan time;
            values.Add("ЖелаемоеВремяС", TimeSpan.TryParse(model.TimeWith, out time) ? time : TimeSpan.MinValue);
            values.Add("ЖелаемоеВремяПо", TimeSpan.TryParse(model.TimeTo, out time) ? time : TimeSpan.MinValue);
            values.Add("СпособОплаты", model.MeansPayment);
            values.Add("СрочныйВыезд", model.Urgently);
            values.Add("Примечание", model.Notes);

            var deliveryId = clientsModel.AddDelivery(values);
            foreach (var product in products)
            {

                if (product.TypeName.IndexOf("КАСКО", StringComparison.OrdinalIgnoreCase) > -1)
                {
                    var directionId = string.Empty;
                    var calculation = rbsCalcModel.GetCalculationKasko(product.CalcId);

                    var kindInsurance = product.DocumentPocket;
                    var calculationForConfirm = rbsCalcModel.GetCalculationForConfirm(product.ConfirmedCalcId);

                    #region Создаем в колл-центре заявку на страхование и клиента через внешнюю интеграцию (так проще)

                    var html = new Dictionary<string, string>();
                    html.Add("Вид страхования", kindInsurance);
                    html.Add("Объект страхования",
                             string.Format("{0} {1} {2}", calculation.CarManufacture, calculation.CarModel,
                                           calculation.Release));
                    html.Add("Подтвердил",
                             string.Format("{0} {1} {2}", CurrentUser.LastName, CurrentUser.FirstName,
                                           CurrentUser.MiddleName));
                    html.Add("Тип подтверждения",
                             rosModel.GetEntityValue<string>(product.ConfirmedCalcId, "ТипПодтверждения"));
                    html.Add("Страховая компания",
                             rosModel.GetEntityValue<string>(product.ConfirmedCalcId, "НазваниеОбъекта"));
                    html.Add("Страховая сумма", calculationForConfirm.InsuredSum);
                    html.Add("Тариф", calculationForConfirm.Rate);
                    html.Add("Расчетная премия", calculationForConfirm.CalculatedPremium);
                    html.Add("Официальная скидка", calculationForConfirm.OfficialDiscount);
                    html.Add("Неофициальная скидка", calculationForConfirm.UnofficialDiscount);
                    html.Add("Премия по полису", calculationForConfirm.PremiumPolicy);
                    html.Add("Величина 1-го взноса", calculationForConfirm.Fee);
                    html.Add("Величина 1-го взноса руб", calculationForConfirm.FeeRub);
                    html.Add("Стоимость полиса", calculationForConfirm.CostPolicy);

                    var sb = new StringBuilder();
                    sb.Append("<table>");
                    foreach (var d in html)
                        if (!d.Key.Contains("Телефон"))
                            sb.AppendFormat("<tr><th>{0}</th><td>{1}</td></tr>", d.Key, d.Value);

                    sb.Append("</table>");

                    var html_txt = sb.ToString();

                    var paramList = new Dictionary<string, object>();
                    paramList["IsAsinc"] = false.ToString();
                    paramList["FIO"] = model.Name;
                    paramList["Phones"] = model.Phone;
                    paramList["Email"] = model.Email;
                    paramList["Addres"] = model.Address;
                    paramList["Source"] = "azb24";
                    paramList["KindOfInsurance"] = kindInsurance;
                    paramList["Marka"] = calculation.CarManufacture;
                    paramList["Model"] = calculation.CarModel;
                    paramList["YearObject"] = calculation.Release;
                    paramList["HtmlForm"] = html_txt;

                    var serverUrl = ApplicationSettingsProvider.DirectionToLeaveServerUrl;

                    var req = System.Net.WebRequest.Create(serverUrl);
                    req.Method = "POST";
                    req.ContentType = "application/x-www-form-urlencoded";

                    var query = string.Join("&",
                                            paramList.Select(p => string.Format("{0}={1}", p.Key, p.Value)).ToArray());

                    byte[] requestBodyBytes = Encoding.UTF8.GetBytes(query);

                    req.ContentLength = requestBodyBytes.Length;

                    var responseStr = string.Empty;
                    try
                    {
                        Stream newStream = req.GetRequestStream();
                        newStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
                        newStream.Close();
                        WebResponse response = req.GetResponse();
                        var reader = new StreamReader(response.GetResponseStream());
                        responseStr = reader.ReadToEnd().Trim();
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message, ex);
                    }
                    
                    decimal webId;
                    if (decimal.TryParse(responseStr, out webId))
                    {
                        var card = new Dictionary<string, string>
                                       {
                                           {"Марка", calculation.CarManufacture},
                                           {"Модель", calculation.CarModel},
                                           {"Год выпуска", calculation.Release},
                                           {"Регион", calculation.Region},
                                           {"Страхователь", calculation.Insurant},
                                           {"Новое", calculation.IsNewCar},
                                           {"Дата расчета", calculation.DateOfCalculation},
                                           {"Гарантия", calculation.Guaranty},
                                           {"Мощность", calculation.Power},
                                           {"Кредит", calculation.Credit},
                                           {"Стоимость ТС", calculation.Cost},
                                           {"Валюта расчета", calculation.Currency},
                                           {"Франшиза в рублях", calculation.FranshizaInRub},
                                           {"Франшиза в процентах", calculation.FranshizaInProc},
                                           {"Форма возмещения", calculation.Compensation},
                                           {"Масса", calculation.Mass},
                                           {"Оплата", calculation.Payment},
                                           {"Срок страхования", calculation.InsurancePeriod},
                                           {"Переход", calculation.Transition},
                                           {"Условия хранения", calculation.StorageCondition},
                                           {"Предельный пробег", calculation.Maxpath},
                                           {"Количество ТС", calculation.QuantityTs},
                                           {"Руль", calculation.ControlWheel},
                                           {"ЭПС", calculation.Signaling},
                                           {"ЭПС с автозапуском", calculation.Autostart},
                                           {"Метка", calculation.Siglabel},
                                           {"МПУ", calculation.Mpu},
                                           {"Иммобилайзер", calculation.Immo},
                                           {"Противоугонный комплекс", calculation.Siganticreep},
                                           {"ОПС", calculation.Sigantidamping},
                                           {"Допущенные водители", calculation.TypeDrivers}
                                       };
                        switch (calculation.TypeDrivers)
                        {
                            case "Ограниченное количество":
                                for (var j = 0; j < calculation.Drivers.Count; j++)
                                {
                                    card.Add("Пол водителя " + (j == 0 ? "" : (j + 1).ToString()),
                                             calculation.Drivers[j].Sex);
                                    card.Add("Возраст водителя " + (j == 0 ? "" : (j + 1).ToString()),
                                             calculation.Drivers[j].Age);
                                    card.Add("Стаж водителя " + (j == 0 ? "" : (j + 1).ToString()),
                                             calculation.Drivers[j].Experience);
                                    card.Add("Наличие брака водителя " + (j == 0 ? "" : (j + 1).ToString()),
                                             calculation.Drivers[j].Married);
                                    card.Add("Количество детей водителя " + (j == 0 ? "" : (j + 1).ToString()),
                                             calculation.Drivers[j].Children);
                                }
                                break;
                            case "Неограниченное количество":
                                card.Add("Минимальный возраст", calculation.MinAge);
                                card.Add("Минимальный стаж", calculation.MinPeriod);
                                break;
                        }

                        rosModel.UpdateEntityValueCallCenter(webId.ToString(), "XmlФорма",
                                                             new Ros.RBS.Dal().СериализоватьИСохранитьЗначение(
                                                                 card.ToDictionary(
                                                                     k => k.Key.Replace(" ", "_") + "_",
                                                                     v => v.Value)));
                        rosModel.UpdateEntityValueCallCenter(webId.ToString(), "ВиртуальныйКаталог",
                                                             "/Заявление/Агент/Кабинет/");
                    }

                    #endregion

                    #region Создаем направление в колцентре

                    var dic = new Dictionary<string, object>();
                    // Словарь для сохранения направления в Колцентр Азббуки
                    dic.Add("СсылкаНаЗаявку", webId);
                    if (Request.Form.AllKeys.Contains("saveandsend"))
                    {
                        dic.Add("СтатусНаправления", "В работе");
                    }
                    if (Request.Form.AllKeys.Contains("save"))
                    {
                        dic.Add("СтатусНаправления", "Черновик");
                    }
                    var key = rosModel.GetEntityValue<string>(CurrentUser.Id, "ИдентификаторОбъекта");
                    decimal id = 0;
                    if (key.Contains("RBS"))
                    {
                        id = rosModel.GetEntityValueCallCenter<decimal>(key, "id_node");
                    }
                    dic.Add("СсылкаНаПродавца", id > 0 ? id : 0);
                    dic.Add("ВиртуальныйКаталог", "/НаправленияНаСтрахование/Распределение/");
                    dic.Add("АдресДоставки", model.Address);
                    dic.Add("Примечание", model.Notes);
                    dic.Add("СкидкаПроцент",
                            double.Parse(calculationForConfirm.OfficialDiscount) +
                            double.Parse(calculationForConfirm.UnofficialDiscount));
                    dic.Add("СуммаПремииПоПолису", double.Parse(calculationForConfirm.PremiumPolicy));
                    dic.Add("СуммаВзносаПоПолису", double.Parse(calculationForConfirm.FeeRub));
                    dic.Add("ПолучитьСКлиента",
                            Double.Parse(string.IsNullOrEmpty(product.GetPay) ? "0" : product.GetPay));
                    dic.Add("ПредочитаемаяСтраховаяКомпания", html["Страховая компания"]);

                    var checkOut = Convert.ToDateTime(model.Date + " " + model.TimeWith);
                    var endDateofEvent = checkOut.AddHours(1).AddMinutes(30);

                    if (!string.IsNullOrWhiteSpace(model.TimeTo))
                        endDateofEvent = Convert.ToDateTime(model.Date + " " + model.TimeTo);
                    dic.Add("ДатаВыезда", checkOut);
                    dic.Add("ДатаНачалаСобытия", checkOut);
                    dic.Add("ДатаОкончанияСобытия", endDateofEvent);
                    dic.Add("ПримечаниеКоВремени", "до " + endDateofEvent.ToShortTimeString());
                    dic.Add("ОнЛайнГрафик", "Агенты - " + kindInsurance);
                    dic.Add("НеобходимостьФотоТс", product.PhotoTs);
                    dic.Add("СпособОплаты", model.MeansPayment);
                    dic.Add("АлгоритмРассрочки", string.Empty);
                    dic.Add("ФормаВыплаты", calculation.Compensation);
                    dic.Add("ПрограммаCтрахования", string.Empty);
                    dic.Add("СервиснаяПрограмма", string.Empty);
                    var documentsForCallCenter = product.Documents.Aggregate(string.Empty,
                                                                             (current, documentId) =>
                                                                             current +
                                                                             string.Format("{0}, ",
                                                                                           rosModel.GetEntityValue
                                                                                               <string>(documentId,
                                                                                                        "НазваниеОбъекта")));
                    dic.Add("ПримечаниеКПачкеДокументов", documentsForCallCenter);

                    var tmp = 0M;
                    decimal.TryParse(calculationForConfirm.InsuredSum.Replace(".", ","), out tmp);
                    dic.Add("СтоимостьТс", tmp);

                    directionId =
                        rosModel.AddEntityToCallCenter("НаправленияНаСтрахование", "НаправлениеНаСтрахование", dic).
                            ToString();

                    #endregion
                    var documents = product.Documents.Aggregate(string.Empty, (current, documentId) => current + string.Format("{0};", documentId));
                    clientsModel.AddProductToDelivery(deliveryId, new Dictionary<string, object>
                                                                      {
                                                                          {"НазваниеОбъекта", product.CompanyName},
                                                                          {"Тип", product.Type},
                                                                          {"СсылкаНаРасчет", Decimal.Parse(product.CalcId)},
                                                                          {"ПолучитьСКлиента", Double.Parse(string.IsNullOrEmpty(product.GetPay)? "0": product.GetPay)},
                                                                          {"ФотоТс", product.PhotoTs},
                                                                          {"Примечания", product.Notes},
                                                                          {"ИдентификаторОбъекта ", (!string.IsNullOrEmpty(directionId) ? string.Format("RBC:{0}",directionId): "")},
                                                                          {"ПачкаДокументов", documents},
                                                                          {"СсылкаНаПодтвержденныйРасчет", product.Id}
                                                                      });

                    System.Threading.Tasks.Task.Factory.StartNew(
                        () =>
                        {
                            try
                            {
                                #region Создаем котировочный лист
                                if ("КАСКО".Equals(kindInsurance))
                                {
                                    var Items = new List<Ros.RBS.Dal.КотировочныйЛистItem>();

                                    var ОценочнаяСтоимсоть = 0M;
                                    decimal.TryParse(calculationForConfirm.InsuredSum.Replace(".", ","), out ОценочнаяСтоимсоть);

                                    var Тариф = 0M;
                                    decimal.TryParse(calculationForConfirm.Rate.Replace(".", ","), out Тариф);

                                    var item = new Ros.RBS.Dal.КотировочныйЛистItem(html["Страховая компания"])
                                                   {
                                                       ОценочнаяСтоимсоть = ОценочнаяСтоимсоть,
                                                       Тариф = Тариф
                                                   };

                                    Items.Add(item);

                                    // Создадим консультирование 
                                    var vals = new Dictionary<string, object>();
                                    vals.Add("ДатаПерезвона", DateTime.Now);
                                    vals.Add("ДатаПерезвонаПредпоследняя", DateTime.Now);
                                    vals.Add("СсылкаНаПользователя", id);
                                    vals.Add("СтатусКонсультации", "Обзвон");
                                    vals.Add("СсылкаНаКлиента", rosModel.GetEntityValueCallCenter<decimal>(webId.ToString(), "СсылкаНаКлиента"));
                                    vals.Add("ВиртуальныйКаталог", "/Консалтинг/");
                                    vals.Add("ДатаСтрахования", checkOut);

                                    var IdКонсультации = rosModel.AddEntityToCallCenter("Консалтинг", "Консультирование", vals);

                                    vals = new Dictionary<string, object>();
                                    vals.Add("СсылкаНаЗаявку", webId);
                                    vals.Add("Результат", "В работе");

                                    var IdРезультата = rosModel.AddEntityToCallCenter(IdКонсультации.ToString(), "РезультатКонсультированияПоЗаявке", vals);

                                    // Укажим в направление ссылку на результат
                                    rosModel.UpdateEntityValueCallCenter(directionId.ToString(), "СсылкаНаРезультаПоКонсультированию", IdРезультата);

                                    vals = new Dictionary<string, object>();
                                    vals.Add("СсылкаНаЗаявку", webId);
                                    vals.Add("СсылкаНаРезультаПоКонсультированию", IdРезультата);
                                    vals.Add("ВиртуальныйКаталог", "/КотировочныйЛист/");
                                    vals.Add("СсылкаНаПользователя", id);

                                    var IdЛист = rosModel.AddEntityToCallCenter(IdРезультата.ToString(), "КотировочныйЛист", vals);
                                    rosModel.UpdateEntityValueCallCenter(IdРезультата.ToString(), "СсылкаНаТекущийКотировочныйЛист", IdЛист);

                                    rosModel.UpdateEntityValueCallCenter(IdЛист.ToString(), "List<КотировочныйЛистItem>", new Ros.RBS.Dal().СериализоватьИСохранитьЗначение(Items));
                                }
                                #endregion
                            }
                            catch (Exception ex)
                            {
                                logger.Error(ex.Message, ex);
                            }
                        });
                }

                #region Осаго
                if (product.TypeName.IndexOf("ОСАГО", StringComparison.OrdinalIgnoreCase) > -1)
                {
                    var directionId = string.Empty;
                    var calculation = new Osago();
                    var objectInsurance = new FullObjectOfInsurance();
                    if (!string.IsNullOrEmpty(product.CalcId) && !string.IsNullOrEmpty(product.ConfirmedCalcId))
                    {
                        calculation = rbsCalcModel.GetCalculationOsago(product.CalcId);
                        objectInsurance = cabinetModel.GetObject(rosModel.GetEntityValue<decimal>(product.CalcId, "СсылкаНаОбъект").ToString());
                    }

                    var kindInsurance = product.TypeName;
                    //var calculationForConfirm = rbsCalcModel.GetCalculationForConfirm(product.ConfirmedCalcId);

                    #region Создаем в колл-центре заявку на страхование и клиента через внешнюю интеграцию (так проще)
                    var html = new Dictionary<string, string>();
                    html.Add("Вид страхования", kindInsurance);
                    if (!string.IsNullOrEmpty(product.CalcId) && !string.IsNullOrEmpty(product.ConfirmedCalcId))
                    {
                        html.Add("Объект страхования", string.Format("{0} {1} {2}", objectInsurance.CarManufacture, objectInsurance.CarModel, objectInsurance.Release));
                        html.Add("Подтвердил", string.Format("{0} {1} {2}", CurrentUser.LastName, CurrentUser.FirstName, CurrentUser.MiddleName));
                        html.Add("Премия по полису", product.PremiumPolicy);
                    }
                    html.Add("Страховая компания", product.CompanyName);



                    var sb = new StringBuilder();
                    sb.Append("<table>");
                    foreach (var d in html)
                        if (!d.Key.Contains("Телефон"))
                            sb.AppendFormat("<tr><th>{0}</th><td>{1}</td></tr>", d.Key, d.Value);

                    sb.Append("</table>");

                    var html_txt = sb.ToString();

                    var paramList = new Dictionary<string, object>();
                    paramList["IsAsinc"] = false.ToString();
                    paramList["FIO"] = model.Name;
                    paramList["Phones"] = model.Phone;
                    paramList["Email"] = model.Email;
                    paramList["Addres"] = model.Address;
                    paramList["Source"] = "azb24";
                    paramList["KindOfInsurance"] = kindInsurance;
                    if (!string.IsNullOrEmpty(product.CalcId) && !string.IsNullOrEmpty(product.ConfirmedCalcId))
                    {
                        paramList["Marka"] = objectInsurance.CarManufacture;
                        paramList["Model"] = objectInsurance.CarModel;
                        paramList["YearObject"] = objectInsurance.Release;
                    }
                    paramList["HtmlForm"] = html_txt;

                    var serverUrl = ApplicationSettingsProvider.DirectionToLeaveServerUrl;

                    var req = WebRequest.Create(serverUrl);
                    req.Method = "POST";
                    req.ContentType = "application/x-www-form-urlencoded";

                    var query = string.Join("&", paramList.Select(p => string.Format("{0}={1}", p.Key, p.Value)).ToArray());

                    byte[] requestBodyBytes = Encoding.UTF8.GetBytes(query);

                    req.ContentLength = requestBodyBytes.Length;
                    var responseStr = string.Empty;
                    try
                    {
                        var newStream = req.GetRequestStream();
                        newStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
                        newStream.Close();

                        var response = req.GetResponse();
                        var reader = new StreamReader(response.GetResponseStream());
                        responseStr = reader.ReadToEnd().Trim();
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message, ex);
                    }

                    decimal webId;
                    if (decimal.TryParse(responseStr, out webId))
                        rosModel.UpdateEntityValueCallCenter(webId.ToString(), "ВиртуальныйКаталог", "/Заявление/Агент/Кабинет/");

                    #endregion

                    #region Создаем направление в колцентре
                    var dic = new Dictionary<string, object>(); // Словарь для сохранения направления в Колцентр Азббуки
                    dic.Add("СсылкаНаЗаявку", webId);
                    if (Request.Form.AllKeys.Contains("saveandsend"))
                    {
                        dic.Add("СтатусНаправления", "В работе");
                    }
                    if (Request.Form.AllKeys.Contains("save"))
                    {
                        dic.Add("СтатусНаправления", "Черновик");
                    }
                    var key = rosModel.GetEntityValue<string>(CurrentUser.Id, "ИдентификаторОбъекта");
                    decimal id = 0;
                    if (key.Contains("RBS"))
                    {
                        id = rosModel.GetEntityValueCallCenter<decimal>(key, "id_node");
                    }
                    dic.Add("СсылкаНаПродавца", id > 0 ? id : 0);
                    dic.Add("ВиртуальныйКаталог", "/НаправленияНаСтрахование/Распределение/");
                    dic.Add("АдресДоставки", model.Address);
                    dic.Add("Примечание", model.Notes);
                    if (!string.IsNullOrEmpty(product.CalcId) && !string.IsNullOrEmpty(product.ConfirmedCalcId))
                    {
                        dic.Add("СуммаПремииПоПолису", double.Parse(product.PremiumPolicy));
                    }
                    dic.Add("ПолучитьСКлиента", Double.Parse(string.IsNullOrEmpty(product.GetPay) ? "0" : product.GetPay));
                    dic.Add("ПредочитаемаяСтраховаяКомпания", html["Страховая компания"]);

                    var checkOut = Convert.ToDateTime(model.Date + " " + model.TimeWith);
                    var endDateofEvent = checkOut.AddHours(1).AddMinutes(30);

                    if (!string.IsNullOrWhiteSpace(model.TimeTo))
                        endDateofEvent = Convert.ToDateTime(model.Date + " " + model.TimeTo);
                    dic.Add("ДатаВыезда", checkOut);
                    dic.Add("ДатаНачалаСобытия", checkOut);
                    dic.Add("ДатаОкончанияСобытия", endDateofEvent);
                    dic.Add("ПримечаниеКоВремени", "до " + endDateofEvent.ToShortTimeString());
                    dic.Add("ОнЛайнГрафик", "Агенты - " + kindInsurance);
                    dic.Add("СпособОплаты", model.MeansPayment);
                    dic.Add("АлгоритмРассрочки", string.Empty);
                    dic.Add("ПрограммаCтрахования", string.Empty);
                    dic.Add("СервиснаяПрограмма", string.Empty);

                    //var tmp = 0M;
                    //decimal.TryParse(calculationForConfirm.InsuredSum.Replace(".", ","), out tmp);
                    dic.Add("СтоимостьТс", 0M);

                    directionId = rosModel.AddEntityToCallCenter("НаправленияНаСтрахование", "НаправлениеНаСтрахование", dic).ToString();

                    #endregion
                    //var documents = product.Documents.Aggregate(string.Empty, (current, documentId) => current + string.Format("{0};", documentId));
                    clientsModel.AddProductToDelivery(deliveryId, new Dictionary<string, object>
                                                                  {
                                                                      {"НазваниеОбъекта", product.CompanyName},
                                                                      {"Тип", product.Type},
                                                                      {"СсылкаНаРасчет", Decimal.Parse(!string.IsNullOrEmpty(product.CalcId) ? product.CalcId : "0")},
                                                                      {"ПолучитьСКлиента", Double.Parse(string.IsNullOrEmpty(product.GetPay)? "0": product.GetPay)},
                                                                      {"Примечания", product.Notes},
                                                                      {"ИдентификаторОбъекта ", (!string.IsNullOrEmpty(directionId) ? string.Format("RBC:{0}",directionId): "")},
                                                                      {"СсылкаНаПодтвержденныйРасчет", Decimal.Parse(!string.IsNullOrEmpty(product.ConfirmedCalcId) ? product.ConfirmedCalcId : "0")}
                                                                  });

                }
                #endregion

            }
            return RedirectToAction("Tickets", new { page = 1 });
        }


        [HttpPost]
        public JsonResult GetInfoClient(string clientId)
        {
            var results = new Dictionary<string, string>();
            results.Add("Phone", rosModel.GetEntityValue<string>(clientId, "ТелефонныйНомер"));
            results.Add("Email", rosModel.GetEntityValue<string>(clientId, "Email"));
            results.Add("Address", rosModel.GetEntityValue<string>(clientId, "Адрес0"));
            var serializer = new JavaScriptSerializer();
            return Json(serializer.Serialize(results));
        }
        public ActionResult Kv(string pagesize, int? page, string company, string product)
        {
            var model = new MyKvViewModel();
            if (!page.HasValue)
            {
                page = 1;
            }
            if (string.IsNullOrEmpty(pagesize) || pagesize == "0")
            {
                pagesize = model.ListForPageSize.First().Value;
            }
            model.PolicyItems = financeModel.GetAllFinancialPolicy();
            if (!string.IsNullOrEmpty(company))
            {
                model.PolicyItems = model.PolicyItems.Where(x => x.Company == company).ToList();
            }
            if (!string.IsNullOrEmpty(product))
            {
                model.PolicyItems = model.PolicyItems.Where(x => x.TypeOfInsurance == product).ToList();
            }
            model.PageCount = (int)Math.Ceiling((double)model.PolicyItems.Count / Int32.Parse(pagesize));
            model.PolicyItems = model.PolicyItems.Skip((page.Value - 1) * Int32.Parse(pagesize)).Take(Int32.Parse(pagesize)).ToList();
            model.PageNumber = page.Value;
            /*if (model.Tickets.Count == 0 && pageCount > 0)
            {
                if (page > 1)
                {
                    page = model.PageCount;
                    return RedirectToAction("Tickets", new { page, pagesize, product, company });
                }
            }*/
            return View(model);
        }
        public ActionResult ConfirmedTarif(string pagesize, int? page, string @object)
        {
            var model = new MyConfirmedTarifViewModel();
            if (!page.HasValue)
            {
                page = 1;
            }
            if (string.IsNullOrEmpty(pagesize) || pagesize == "0")
            {
                pagesize = model.ListForPageSize.First().Value;
            }
            model.Calculations = rbsCalcModel.GetAllConfirmedCalculationsKasko(CurrentUser.Id);

            foreach (var calc in model.Calculations)
            {
                calc.ConfirmedCalcs = calc.ConfirmedCalcs.OrderByDescending(x => x.ConfirmationDate).ToList();
            }
            model.Calculations = model.Calculations.OrderByDescending(x => x.ConfirmedCalcs.First().ConfirmationDate).ToList();

            var calculationsCount = 0;
            foreach (var calc in model.Calculations)
            {
                model.ListForObject.Add(new SelectListItem { Text = string.Format("{0} {1}, {2}", calc.CarManufacture, calc.CarModel, calc.Release), Value = string.Format("{0} {1}, {2}", calc.CarManufacture, calc.CarModel, calc.Release).ToLower() });
                calculationsCount += calc.ConfirmedCalcs.Count;
            }

            if (!string.IsNullOrEmpty(@object))
            {
                model.Calculations =
                    model.Calculations.Where(
                        x => string.Format("{0} {1}, {2}", x.CarManufacture, x.CarModel, x.Release).ToLower() == @object).ToList();
                calculationsCount = model.Calculations.Sum(calc => calc.ConfirmedCalcs.Count);
            }

            int pageSize;
            if (!Int32.TryParse(pagesize, out pageSize))
            {
                pageSize = int.Parse(model.ListForPageSize.First().Value);
            }
            model.Calculations = rbsCalcModel.SplitByPages(model.Calculations, (page.Value - 1) * pageSize, pageSize);
            model.PageNumber = page.Value;
            model.PageCount = (int)Math.Ceiling((double)calculationsCount / Int32.Parse(pagesize));
            return View(model);
        }

        public ActionResult DeleteConfirmTarif(string confirmCalcId, string pagesize, int? page, string @object)
        {
            rosModel.DeleteEntity(confirmCalcId);
            return RedirectToAction("ConfirmedTarif", new { page, pagesize, @object });
        }

        [HttpPost]
        public ActionResult DeleteConfirmTarifs(string[] tarif, string pagesize, int? page, string @object)
        {
            foreach (var id in tarif)
            {
                rosModel.DeleteEntity(id);
            }
            return RedirectToAction("ConfirmedTarif", new { page, pagesize, @object });
        }

        public ActionResult OsagoResult(string id)
        {
            var model = new OsagoResultViewModel();
            var typeCalc = rosModel.GetEntityValue<string>(id, "Тип.Имя");
            switch (typeCalc)
            {
                case "ПодтвержденныйРасчетОсаго":
                    var confirmedCalc = rosModel.GetEntityById("ПодтвержденныйРасчетОсаго", id, new[] { "СсылкаНаКомпанию", "@РодительскийРаздел" });
                    if (confirmedCalc != null)
                    {
                        model.Id = confirmedCalc["id_node"].ToString();
                        model.ComapnyName = confirmedCalc["СсылкаНаКомпанию.НазваниеОбъекта"].ToString();
                        model.ComapnyId = confirmedCalc["СсылкаНаКомпанию"].ToString();
                        model.Osago = rbsCalcModel.GetCalculationOsago(confirmedCalc["@РодительскийРаздел"].ToString());
                    }
                    break;
                case "РасчётСтраховки":
                    model.Id = id;
                    model.Osago = rbsCalcModel.GetCalculationOsago(id);
                    break;
            }
            return View(model);
        }


        public ActionResult TicketsConfirmedTarif(int? page, string pagesize, string status)
        {
            var model = new MyTicketsConfirmedTarifViewModel();
            if (!page.HasValue)
            {
                page = 1;
            }
            if (string.IsNullOrEmpty(pagesize) || pagesize == "0")
            {
                pagesize = model.ListForPageSize.First().Value;
            }
            if (CurrentUser.IdRBS > 0)
            {
                var q = new Dictionary<string, object>();

                q.Add("СсылкаНаАгента", CurrentUser.IdRBS);

                if (!string.IsNullOrWhiteSpace(model.Status))
                    switch (model.Status)
                    {
                        case "atwork": q.Add("Статус", "В работе,Ожидается обработка");
                            break;
                        case "completed": q.Add("Статус", "Отработан");
                            break;
                    }

                var data = new Business.RosRBSMigration.МиграцияДанныхClient().Search("ЗаявкиНаРасчет", q, Int32.Parse(pagesize), page.Value);

                model.Items = data.Значение.AsEnumerable().Select(x => new EditCalc
                                                                           {
                                                                               CarModel = x.Field<string>("Модель"),
                                                                               CarManufacture = x.Field<string>("Марка"),
                                                                               Release = x.Field<int?>("ГодИзготовления").ToString(),
                                                                               Status = x.Field<string>("СтатусКотировки1"),
                                                                               QuoteName = x.Field<string>("НомерКотировки"),
                                                                               UnderwriterName = x.Field<string>("АндерРасчет"),
                                                                               Risk = x.Field<string>("РискСтрахования"),
                                                                               Companies = x.Field<string>("СтраховыеКомпанииПподтверждаемойКотировки")
                                                                           }).OrderBy(x => x.CarManufacture + x.CarModel + x.Release).ToList();
                model.PageNumber = page.Value;
                model.PageCount = Convert.ToInt32(data.PageCount);
            }
            return View(model);
        }

        public ActionResult OrderBso()
        {
            var model = new MyOrderBsoViewModel();
            return View(model);
        }
        [HttpPost]
        public ActionResult OrderBso(string products)
        {
            var serializer = new JavaScriptSerializer();
            var listProducts = serializer.Deserialize<List<ProductForOrderBso>>(products);
            var orderBsoId = rosModel.AddEntity(CurrentUser.Id, "ЗаявкаНаПолучениеБСО", new Dictionary<string, object>());
            foreach (var item in listProducts)
            {
                var val = new Dictionary<string, object>();
                val.Add("НазваниеОбъекта", item.ProductName + ", " + item.CompanyName);
                val.Add("СсылкаНаПродукт", item.ProductId);
                val.Add("СсылкаНаКомпанию", item.CompanyId);
                val.Add("Количество", Int32.Parse(item.Quantity));
                rosModel.AddEntity(orderBsoId.ToString(), "ПродуктЗаявки", val);
            }                        
            return RedirectToAction("OrderBso");
        }
    }
}
